package IdeaGui;

/**
 * User: Mike
 * Date: 11/11/11
 */


import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

import java.awt.*;
import java.util.Hashtable;

/**
 * This creates a bar chart:
 *
 * 1) call the constructor
 * 2) update the Chart
 * 3) call getChart
 * .
 * to create new chart in the GUI... add a non palette object: ChartPanel.. select both of the check boxes
 */
public class ChartBar extends ApplicationFrame {

    ChartPanel chartPanel;
    JFreeChart chart;
    CategoryPlot plot;
    static ChartBar demo = new ChartBar("Bar Chart Demo");


    public ChartBar(final String title) {
        super(title);
        final CategoryDataset dataset = createDataset();
        this.chart = createChart(dataset);
        this.chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(500, 270));
        setContentPane(chartPanel);
    }

    public void updateChart(Hashtable<String, Double> valueSet1, Hashtable<String, Double> valueSet2, Hashtable<String, Double> valueSet3, String[] seriesNames, String[] catagoryNames) {
        // create the dataset...
        final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for(int i=0;i<valueSet1.size();i++){
            dataset.addValue(valueSet1.get(String.valueOf(i)), seriesNames[0], catagoryNames[i]);
        }
        for(int i=0;i<valueSet2.size();i++){
            dataset.addValue(valueSet2.get(String.valueOf(i)), seriesNames[0], catagoryNames[i]);
        }
        for(int i=0;i<valueSet3.size();i++){
            dataset.addValue(valueSet3.get(String.valueOf(i)), seriesNames[0], catagoryNames[i]);
        }
        // todo: this data set seems to start at 2... not sure why.. need to fix it.

//        dataset.addValue(5.0, series2, category1);
//        dataset.addValue(7.0, series2, category2);
//        dataset.addValue(6.0, series2, category3);
//        dataset.addValue(8.0, series2, category4);
//        dataset.addValue(4.0, series2, category5);
//
//        dataset.addValue(4.0, series3, category1);
//        dataset.addValue(3.0, series3, category2);
//        dataset.addValue(2.0, series3, category3);
//        dataset.addValue(3.0, series3, category4);
//        dataset.addValue(6.0, series3, category5);
        createChart(dataset);
    }

    public JFreeChart getChart() {
        return chart;
    }

    private CategoryDataset createDataset() {

        // row keys...
        final String series1 = "First";
        final String series2 = "Second";
        final String series3 = "Third";

        // column keys...
        final String category1 = "Category 1";
        final String category2 = "Category 2";
        final String category3 = "Category 3";
        final String category4 = "Category 4";
        final String category5 = "Category 5";

        // create the dataset...
        final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        dataset.addValue(1.0, series1, category1);
        dataset.addValue(4.0, series1, category2);
        dataset.addValue(3.0, series1, category3);
        dataset.addValue(5.0, series1, category4);
        dataset.addValue(5.0, series1, category5);

        dataset.addValue(5.0, series2, category1);
        dataset.addValue(7.0, series2, category2);
        dataset.addValue(6.0, series2, category3);
        dataset.addValue(8.0, series2, category4);
        dataset.addValue(4.0, series2, category5);

        dataset.addValue(4.0, series3, category1);
        dataset.addValue(3.0, series3, category2);
        dataset.addValue(2.0, series3, category3);
        dataset.addValue(3.0, series3, category4);
        dataset.addValue(6.0, series3, category5);

        return dataset;

    }

    private JFreeChart createChart(final CategoryDataset dataset) {

        // create the cBar...
        chart = ChartFactory.createBarChart(
                "Bottle Info",         // cBar title
                "Bottls",               // domain axis label
                "Characteristics",                  // range axis label
                dataset,                  // data
                PlotOrientation.VERTICAL, // orientation
                true,                     // include legend
                true,                     // tooltips?
                false                     // URLs?
        );

        // NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...

        // set the background color for the cBar...
        chart.setBackgroundPaint(Color.white);

        // get a reference to the plot for further customisation...
        this.plot = chart.getCategoryPlot();
        plot.setBackgroundPaint(Color.white);
        plot.setDomainGridlinePaint(Color.white);
        plot.setRangeGridlinePaint(Color.white);

        // set the range axis to display integers only...
        final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

        // disable bar outlines...
        final BarRenderer renderer = (BarRenderer) plot.getRenderer();
        renderer.setDrawBarOutline(false);

        // set up gradient paints for series...
        final GradientPaint gp0 = new GradientPaint(
                0.0f, 0.0f, Color.blue.darker().darker(),
                0.0f, 0.0f, Color.blue
        );
        final GradientPaint gp1 = new GradientPaint(
                0.0f, 0.0f, Color.green.darker().darker(),
                0.0f, 0.0f, Color.green
        );
        final GradientPaint gp2 = new GradientPaint(
                0.0f, 0.0f, Color.red.darker().darker(),
                0.0f, 0.0f, Color.red
        );
        renderer.setSeriesPaint(0, gp0);
        renderer.setSeriesPaint(1, gp1);
        renderer.setSeriesPaint(2, gp2);

        final CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setCategoryLabelPositions(
                CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0)
        );
        // OPTIONAL CUSTOMISATION COMPLETED.

        return chart;
    }

    public static void main(final String[] args) {

//        demo = new ChartBar("Bar Chart Demo");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
//        demo.setVisible(true);

    }

}
